Java-তে Unit Testing হল সফটওয়্যার ডেভেলপমেন্টের একটি অত্যন্ত গুরুত্বপূর্ণ অংশ, যা কোডের বৈশিষ্ট্যগুলো বা ইউনিটগুলো পরীক্ষা করার জন্য ব্যবহৃত হয়। ডেটাবেজ অ্যাপ্লিকেশনগুলির জন্য, H2 Database এক ধরনের ইন-মেমরি ডেটাবেজ সরবরাহ করে, যা Java Unit Testing-এর জন্য খুবই কার্যকরী। H2 ডেটাবেজের মাধ্যমে টেস্টিং প্রক্রিয়া দ্রুত এবং সহজ হয়ে ওঠে, কারণ এটি সহজেই ইনস্টল এবং কনফিগার করা যায় এবং ইন-মেমরি মোডে কাজ করে, যার ফলে ডিস্কের প্রয়োজন হয় না।
এখানে, আমরা H2 Database ব্যবহার করে Java Unit Testing কিভাবে পরিচালনা করা যায়, তা নিয়ে বিস্তারিত আলোচনা করব।
H2 Database এবং Java Unit Testing
H2 Database সাধারণত In-memory Database হিসেবে ব্যবহৃত হয়, যা Unit Testing-এর জন্য উপযুক্ত, কারণ এটি শুধুমাত্র RAM এ ডেটা সঞ্চয় করে এবং টেস্ট শেষ হওয়ার পর ডেটা মুছে ফেলা হয়। এতে করে টেস্টগুলো দ্রুত চলে এবং ডেটাবেজের কোনো স্থায়ী ফাইল তৈরি হয় না।
Java Unit Testing Frameworks
Java Unit Testing-এর জন্য বিভিন্ন টুল এবং ফ্রেমওয়ার্ক ব্যবহার করা হয়, যেমন:
- JUnit
- TestNG
- Mockito (মকিং টেস্টিং এর জন্য)
এখানে আমরা JUnit ব্যবহার করে H2 Database এর সাথে Unit Testing কিভাবে করা যায়, তা দেখব।
Java Unit Testing-এ H2 Database ব্যবহার করার পদক্ষেপ
১. H2 Database Dependency যুক্ত করা
প্রথমে, আপনার Maven বা Gradle প্রকল্পে H2 Database-এর ডিপেনডেন্সি যুক্ত করতে হবে।
Maven ব্যবহার করলে, আপনার pom.xml-এ নিচের ডিপেনডেন্সি যুক্ত করুন:
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>2.1.214</version>
<scope>test</scope>
</dependency>
Gradle ব্যবহার করলে, আপনার build.gradle-এ নিচের কোডটি যুক্ত করুন:
testImplementation 'com.h2database:h2:2.1.214'
২. JUnit এবং H2 Database ব্যবহার করে Unit Test লিখা
H2 Database ব্যবহার করে JUnit টেস্ট তৈরি করতে, আপনাকে প্রথমে H2 ডেটাবেজ কনফিগার করতে হবে এবং তারপর SQL কুয়েরি চালিয়ে টেস্ট লেখার জন্য JUnit ব্যবহার করতে হবে।
উদাহরণ ১: Simple CRUD Operation Test
ধরা যাক, আমাদের একটি users টেবিল রয়েছে এবং আমরা H2 ডেটাবেজের সাহায্যে INSERT, SELECT, UPDATE এবং DELETE অপারেশনগুলো পরীক্ষা করতে চাই।
import org.junit.jupiter.api.*;
import java.sql.*;
import static org.junit.jupiter.api.Assertions.*;
public class H2DatabaseTest {
private Connection connection;
@BeforeEach
public void setUp() throws SQLException {
// In-memory H2 Database setup
connection = DriverManager.getConnection("jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;", "sa", "");
Statement statement = connection.createStatement();
// Creating users table
statement.execute("CREATE TABLE IF NOT EXISTS users (id INT PRIMARY KEY, name VARCHAR, age INT)");
// Insert a test user
statement.execute("INSERT INTO users (id, name, age) VALUES (1, 'John Doe', 25)");
}
@Test
public void testSelectQuery() throws SQLException {
// Select user by id
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
preparedStatement.setInt(1, 1);
ResultSet resultSet = preparedStatement.executeQuery();
// Validate the result
assertTrue(resultSet.next());
assertEquals("John Doe", resultSet.getString("name"));
assertEquals(25, resultSet.getInt("age"));
}
@Test
public void testUpdateQuery() throws SQLException {
// Update user age
PreparedStatement preparedStatement = connection.prepareStatement("UPDATE users SET age = ? WHERE id = ?");
preparedStatement.setInt(1, 30);
preparedStatement.setInt(2, 1);
preparedStatement.executeUpdate();
// Validate the update
PreparedStatement selectStmt = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
selectStmt.setInt(1, 1);
ResultSet resultSet = selectStmt.executeQuery();
assertTrue(resultSet.next());
assertEquals(30, resultSet.getInt("age"));
}
@Test
public void testDeleteQuery() throws SQLException {
// Delete user by id
PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM users WHERE id = ?");
preparedStatement.setInt(1, 1);
preparedStatement.executeUpdate();
// Validate the deletion
PreparedStatement selectStmt = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
selectStmt.setInt(1, 1);
ResultSet resultSet = selectStmt.executeQuery();
assertFalse(resultSet.next());
}
@AfterEach
public void tearDown() throws SQLException {
// Close connection after each test
if (connection != null) {
connection.close();
}
}
}
বিভিন্ন অংশের ব্যাখ্যা:
- @BeforeEach: এই অ্যানোটেশনটি JUnit টেস্টের আগে টেস্ট ডেটাবেজ তৈরি এবং সেটআপ করার জন্য ব্যবহৃত হয়। এখানে H2 Database ইন-মেমরি মোডে সেটআপ করা হচ্ছে এবং একটি
usersটেবিল তৈরি করা হয়েছে। - @Test: এখানে আমরা তিনটি মূল টেস্ট করি:
- testSelectQuery:
usersটেবিল থেকে ব্যবহারকারী নির্বাচন করি এবং তার ডেটা যাচাই করি। - testUpdateQuery: একটি ব্যবহারকারীর বয়স আপডেট করি এবং সঠিকভাবে আপডেট হয়েছে কিনা তা যাচাই করি।
- testDeleteQuery: ব্যবহারকারীকে ডিলিট করি এবং ডিলিট হওয়া রেকর্ডটি চেক করি।
- testSelectQuery:
- @AfterEach: টেস্টের পর ডেটাবেজ সংযোগ বন্ধ করার জন্য ব্যবহৃত হয়।
JUnit Test Example Summary:
- Database Setup: ইন-মেমরি H2 ডেটাবেজের জন্য
DriverManager.getConnectionব্যবহার করা হয়েছে। - Test Assertions: JUnit-এ assertTrue, assertFalse, এবং assertEquals ব্যবহার করা হয়েছে বিভিন্ন ফলাফল যাচাই করার জন্য।
- CRUD Operations: H2 ডেটাবেজে সাধারণ SELECT, UPDATE, এবং DELETE কুয়েরি ব্যবহার করা হয়েছে টেস্টের অংশ হিসেবে।
H2 Database এবং Java Unit Testing এর সুবিধা
- দ্রুত এবং ইন-মেমরি টেস্টিং: H2 ডেটাবেজ ইন-মেমরি মোডে কাজ করার ফলে টেস্টগুলো দ্রুত সম্পন্ন হয় এবং ডিস্কের কোনো ফাইল তৈরি হয় না।
- সার্ভার কনফিগারেশন ছাড়া ডেটাবেজ টেস্টিং: H2 একটি এমবেডেড ডেটাবেজ, যা টেস্টের জন্য সার্ভার কনফিগারেশন ছাড়াই চলতে পারে।
- স্বাধীন টেস্টিং পরিবেশ: প্রতিটি টেস্টে আলাদা ডেটাবেজ তৈরি হয় এবং টেস্ট শেষে তা মুছে ফেলা হয়, যার ফলে আগের টেস্টের কোনো প্রভাব পরবর্তী টেস্টে পড়ে না।
উপসংহার
H2 Database Java Unit Testing-এ ব্যবহারের জন্য অত্যন্ত উপযোগী, বিশেষ করে যখন ইন-মেমরি ডেটাবেজ প্রয়োজন হয়। JUnit-এর সাথে H2 ডেটাবেজ ব্যবহার করে CRUD অপারেশন পরীক্ষা করা সহজ এবং দ্রুত। H2 ডেটাবেজের In-memory মোড এবং lightweight প্রকৃতি Unit Testing প্রক্রিয়াকে আরও দ্রুত, কার্যকর এবং নির্ভরযোগ্য করে তোলে।